import java.util.ArrayList;

import processing.core.*;
//import processing.opengl.*;
import ddf.minim.*;

public class Tuberunner extends PApplet{
	private Minim minim;
	private AudioPlayer taustam;
	private boolean sounds, alkanut, loppunut;

	private static final long serialVersionUID = 1L;
	private float radius = 100; // ympyran koko
	private TubeHallitsija th; // tubehallitsija hallitsee suuren osan peliradan logiikasta
	private ArrayList<Player> pelaajat; // lista pelaajista
	private ArrayList<Player> lopputulos; // lista lopputuloksista. ensimmaiseksi kuollut on listan alkupaassa ja pisimpaan selvinnyt loppupaassa.
	private Peli peli; // alkunankyma
	private Loppu loppuNakyma; // loppunakyma

	public void setup()
	{
		size(1024,800, OPENGL);
		this.peli = new Peli(this); // alustaa alkuvalikon
		stroke(0);
		strokeWeight(3);
		fill(0,0,150);
		stroke(255);
		this.th = new TubeHallitsija(this, 0); 
		this.pelaajat = new ArrayList<Player>(); 
		this.lopputulos = new ArrayList<Player>(); 
		//this.playMusic();
		frameRate(40);

	}

	// Tama metodi piirtaa ja vie pelin logiikkaa eteenpain.
	public void draw()
	{
		if(!alkanut)
		{
			peli.drawAloitus();
		}
		else if (!loppunut)
		{
			this.drawGame();
		}
		else {
			this.loppuNakyma.piirra();
		}
	}

	// Piirtaa pelinakyman putken sisalla
	public void drawGame()
	{
		background(0);
		//kameran paikka ja suunta
		camera(0,0,-100, 0,0,500, 0,1,0);
		lights();
		spotLight(200, 200, 200, 0, -300, 50, 0, 1, 0, 1, 2);
		spotLight(150, 150, 150, 0, 0, -150, 0, 0, 1, 1, 1);//kivempi valaistus
		//testaukseen kameran k��ntely
		//applyMatrix(asento);
		//noFill();
		fill(200,200,100);
		th.liikuTuubi(30);
		fill(100,150,200);//putken v�ri
		th.piirto();
		pushMatrix();
		rotateY(PI);
		fill(255, 0, 0, 100);
		textSize(6);
		text(th.getAika(), 60, 40, 0); // piirtaa sekuntikellon
		popMatrix();

		//		pelaajan piirto
		for(Player pelimies: pelaajat)
		{
			pelimies.draw();
		}



		// Kuolleiden pelaajien hautaus
		int w = 0;
		while(w<pelaajat.size())
		{
			if(pelaajat.get(w).kuollut)
			{
				lopputulos.add(pelaajat.get(w));
				pelaajat.remove(w);
			}
			w++;
		}

		// Pelin lopetus
		if(pelaajat.size()<=0)
		{
			this.lopetaPeli();
		}
	}

	// lopettaa pelin, minka jalkeen siirrytaan loppunakykmaan
	public void lopetaPeli()
	{
		this.loppuNakyma = new Loppu(this, lopputulos, this.th.getAika());
		this.loppunut = true;
	}

	// alustaa pelin ja vie pelaajan tuubin sisalle
	public void aloitaPeli(int pelaajia)
	{

		this.th = new TubeHallitsija(this, 0);
		this.pelaajat = new ArrayList<Player>();
		this.lopputulos = new ArrayList<Player>();
		this.alkanut = true;
		this.loppunut = false;
		for(int i = 1; i<=pelaajia; i++)
		{
			pelaajat.add(new Player(this, i, this.th));
		}
		playMusic();
	}

	public void playMusic()
	{
		minim = new Minim(this);
		taustam = minim.loadFile("music/SweetArcade_loop.mp3", 1024);
		taustam.loop();
	}
	public void stop()//kun ohjelma suljetaan niin musiikit kiinni
	{
		if(taustam != null && alkanut)
		{
			taustam.close();
		}
		if(minim != null)
			minim.stop();
		super.stop();
	}
	public void pauseMusic()
	{
		taustam.pause();
	}
	public void stopMusic()
	{
		taustam.close();
	}
	
	//	public void mouseDragged()
	//	{
	//		float xr = mouseY-pmouseY;
	//		float yr = mouseX-pmouseX;
	//		PMatrix3D kaanto = new PMatrix3D();
	//		kaanto.rotateY(yr/100);
	//		kaanto.rotateX(xr/100);
	//		asento.preApply(kaanto);
	//	}

	// Vie hiirenklikin tarvittaessa eteenpain.
	public void mouseClicked() {
		if (this.alkanut && this.loppunut) {
			this.alkanut = false;
			this.loppunut = false;
			this.stopMusic();
		}
		else if (!this.alkanut && !this.loppunut) {
			this.peli.mouseClicked();
		}
	}

	// Vie nappainpainalluksen Player-luokille
	public void keyPressed() {
		for(Player pelimies: pelaajat)
		{
			pelimies.keyPressed();
		}
	}

	// Vie nappaimen irrotuksen Player-luokille
	public void keyReleased() {
		for(Player pelimies: pelaajat)
		{
			pelimies.keyReleased();
		}
	}

	// antaa ympyran koon
	public float annaRadius() {
		return this.radius;
	}

	// main
	public static void main(String args[]) {
		System.out.println(System.getProperty("java.class.path"));
		PApplet.main(new String[] { "--present", "Tuberunner" });
	}
}
